草庐IT

Java final 与 C++ const

全部标签

c++ - "Most important const"带条件表达式?

考虑以下代码:intfoo(MyClassconst*aPtr=0){MyClassconst&a=aPtr?*aPtr:MyClass();//Eitherbindto*aPtr,ortoadefault-constructedMyClass...returna.bar();}"mostimportantconst"希望在这里使用。目的是允许空aPtr传入(顺便说一句,是的,它必须是一个指针参数),在这种情况下是一个临时的MyClass对象将是默认构造的,并且其生命周期通过绑定(bind)到它的const引用来延长。然而,如果aPtr不为空,引用将绑定(bind)到其指向的对象,而不

c++ - 当 const 方法是公共(public)的并且非 const 方法受到保护时,为什么 C++ 不强制转换为 const?

我创建了一个类,其中包含两个get方法,一个是常量,一个是非常量。const方法是公共(public)的,因此用户可以查询vector。非常量方法是protected,所以我可以用它来修改我需要的数据。但是,当我尝试使用该类并调用get方法时,编译器提示非常量方法受到保护。相反,我必须使用const_cast将对象转换为const,这样我就可以获得公共(public)方法。有办法解决吗?既然有公共(public)方法,为什么编译器不自己进行转换呢?如果我删除protected版本并只保留const版本,它可以正常工作,所以在这种情况下它确实会执行转换。转换为const总是安全的。它正在

c++ - 为什么绑定(bind)到三元的 const 引用会生成拷贝?

这个问题在这里已经有了答案:Returntypeof'?:'(ternaryconditionaloperator)(4个答案)关闭7年前。我对此感到困惑:#includestructX{};voidf(constX&x){std::cerr为什么f的第二次调用会生成一个临时拷贝?编辑:这个问题与其说是类型X,不如说是复制的事实。我从已接受的答案中遗漏了值类别的微妙之处,并期望f的参数直接绑定(bind)到x或X()上,就像将其改写为if语句时那样。

c++ - iterator 和 const_iterator 之间的比较是否效率低下?

变体a:constautoend=whatever.end();for(autoit=whatever.begin();it!=end;++it){//...}变体b:constautoend=whatever.cend();//notethecalltocendinsteandofendherefor(autoit=whatever.begin();it!=end;++it){//...}是否有任何理由相信变体b会比变体a效率低,因为循环条件比较两种不同类型的迭代器?这会导致对它进行隐式转换吗?(end在for循环中多次使用,因此我想把它吊出来。) 最佳答

c++ - 容器优化:为什么 STL 容器方法参数不再使用 allocator::const_reference typedef?

阅读之前:const_reference是typedef,不需要是constT&正如您在std::vector::const_reference=bool中看到的那样.请在阅读其余部分时牢记这一点以正确理解它(正如评论中所建议的那样,这对很多人来说很难)。我想为简单类型(例如int)使用STL容器,但发现它们使用了次优的constT&“反模式”-它适用于大类,但在未内联时对于简单/基本类型不是最优的-考虑嵌入式系统,例如在ARM/ATSAM4L上,带有实例化。问题是:为什么例如vector::push_back使用(constvalue_type&)的参数重新设计而不是自C++11以来

c++ - 为什么 const volatile 引用不能绑定(bind)到右值引用?

我想了解为什么constvolatile引用不能绑定(bind)到右值引用?禁止这种转换的合理原因是什么?在下面的代码中,我注释掉了不编译的行:intmain(){inti=1;//constvolatileint&cvi2=std::move(i);->ERROR:why?constvolatileinti2=0;//constvolatileint&cvi3=std::move(i2);//->ERROR:why?}这是一个更现实的场景,由于类似的原因而无法编译:#includetemplatevoidg(constT&b){//dousefullthings}templatevo

c++ - 临时对象最初是 const 吗?

这个代码是UB吗?structA{voidnonconst(){}};constA&a=A{};const_cast(a).nonconst();换句话说,(临时)对象最初是const吗?我已经仔细阅读了标准,但找不到答案,因此希望能引用相关部分的内容。编辑:对于那些说A{}不是const的人,那么你可以做A{}.nonconst()? 最佳答案 引用的初始化a由[dcl.init.ref]/5给出(大胆的矿山):Otherwise,iftheinitializerexpressionisanrvalue(butnotabit-fi

c++ - 我应该尽可能在 C++11 中用 'const int' 替换 'constexpr int' 吗?

你会更换吗constintone=1;constinttwo=2;用这个?constexprintone=1;constexprinttwo=2;我的理解是否正确,这两个block在语义上是相同的,目前只是个人喜好问题?另一方面,正如constexpr暗示const,你可能会争辩说,总是喜欢更严格的形式更一致,即使在它确实如此的微不足道的情况下也是如此没有什么不同?(我理解当允许右边的表达式更复杂时,情况就完全不同了。所以为了澄清,这个问题只关注最简单的表达式是一个固定整数的情况。) 最佳答案 我认为你说const和constexp

c++ - const 指针(不是指向 const 的指针)和引用之间的功能区别是什么?

我目前正在通过C++Primer学习C++,它解释了引用如何成为另一个变量名的别名。它还解释了指针如何指向另一个变量。它指出指针和引用之间的区别在于指针可以重新分配,而引用不能。在下面的代码示例中,我可以用指针或引用做什么而不能用另一个做?doublepi=3.14;double&piRef=pi;double*constpiPnt=π//bothoftheseexamplesarevalidanddothesamethingpiRef=3.14159;*piPnt=3.14159;//however,ifIattempttoreassignwhatthepointerpoint

c++ - 从 Visual Studio 2010 开始,取消引用集合上的迭代器时的 Const 引用

从VisualStudio2010开始,对集合进行迭代似乎会返回一个迭代器,该迭代器将数据取消引用为“const数据”而不是非常量。以下代码是在VisualStudio2005上编译但在2010上编译不了的示例(这是一个人为的示例,但清楚地说明了我们在自己的代码中发现的问题)。在这个例子中,我有一个存储位置和温度的类。我定义了只使用位置而不是温度的比较运算符(不是全部,只是足以说明问题)。关键是,对我来说,如果位置相同,则两个实例是相同的;我不关心温度。#includeclassDataPoint{public:DataPoint(intx,inty):m_x(x),m_y(y),m_